import csv

class CSVHandler:
    """CSV文件处理类，用于读写CSV文件"""
    
    def write_to_csv(self, file_path, data, headers=None, add_bom=False):
        """
        写入数据到CSV文件
        
        参数:
            file_path: CSV文件路径
            data: 要写入的数据，列表形式
            headers: CSV文件表头，可选
            add_bom: 是否添加UTF-8 BOM（适用于Windows系统）
        """
        try:
            # 根据是否添加BOM选择不同的编码方式
            encoding = 'utf-8-sig' if add_bom else 'utf-8'
            
            with open(file_path, 'w', newline='', encoding=encoding) as csvfile:
                writer = csv.writer(csvfile)
                
                # 如果提供了表头，先写入表头
                if headers:
                    writer.writerow(headers)
                
                # 写入数据
                for row in data:
                    writer.writerow(row)
                
            print(f"成功写入数据到 {file_path}")
            return True
        except Exception as e:
            print(f"写入CSV文件时出错: {str(e)}")
            return False
    
    def read_from_csv(self, file_path):
        """
        从CSV文件读取数据
        
        参数:
            file_path: CSV文件路径
        
        返回:
            包含表头和数据的字典
        """
        try:
            data = []
            headers = []
            
            with open(file_path, 'r', encoding='utf-8') as csvfile:
                reader = csv.reader(csvfile)
                
                # 读取第一行为表头
                first_row = next(reader, None)
                if first_row:
                    headers = first_row
                    
                # 读取其余数据行
                for row in reader:
                    data.append(row)
            
            return {
                'headers': headers,
                'data': data
            }
        except Exception as e:
            print(f"读取CSV文件时出错: {str(e)}")
            return {
                'headers': [],
                'data': []
            }
    
    def write_dict_to_csv(self, file_path, data, fieldnames=None, add_bom=False):
        """
        使用字典形式写入数据到CSV文件
        
        参数:
            file_path: CSV文件路径
            data: 字典列表形式的数据
            fieldnames: 字段名列表，可选（如果不提供则从第一个字典中提取）
            add_bom: 是否添加UTF-8 BOM（适用于Windows系统）
        """
        try:
            # 根据是否添加BOM选择不同的编码方式
            encoding = 'utf-8-sig' if add_bom else 'utf-8'
            
            # 如果没有提供字段名，则从第一个字典中提取
            if not fieldnames and data:
                fieldnames = data[0].keys()
                
            with open(file_path, 'w', newline='', encoding=encoding) as csvfile:
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                
                # 写入表头
                writer.writeheader()
                
                # 写入数据
                for row in data:
                    writer.writerow(row)
                    
            print(f"成功以字典形式写入数据到 {file_path}")
            return True
        except Exception as e:
            print(f"以字典形式写入CSV文件时出错: {str(e)}")
            return False
    
    def read_dict_from_csv(self, file_path):
        """
        以字典形式读取CSV文件数据
        
        参数:
            file_path: CSV文件路径
        
        返回:
            字典列表形式的数据
        """
        try:
            data = []
            
            with open(file_path, 'r', encoding='utf-8') as csvfile:
                reader = csv.DictReader(csvfile)
                
                for row in reader:
                    data.append(dict(row))
                    
            return data
        except Exception as e:
            print(f"以字典形式读取CSV文件时出错: {str(e)}")
            return []

# 示例用法
if __name__ == "__main__":
    # 创建CSV处理器实例
    csv_handler = CSVHandler()
    
    # 示例1: 使用基本方法写入CSV文件（添加BOM以支持Windows系统）
    file_path1 = 'example1.csv'
    headers = ['姓名', '年龄', '城市']
    data = [
        ['张三', '28', '北京'],
        ['李四', '32', '上海'],
        ['王五', '45', '广州'],
        ['赵六', '22', '深圳']
    ]
    csv_handler.write_to_csv(file_path1, data, headers, add_bom=True)
    
    # 读取并显示数据
    result = csv_handler.read_from_csv(file_path1)
    print("\n读取example1.csv文件内容:")
    print(f"表头: {result['headers']}")
    print("数据:")
    for row in result['data']:
        print(row)
    
    # 示例2: 使用字典方法写入CSV文件（添加BOM以支持Windows系统）
    file_path2 = 'example2.csv'
    dict_data = [
        {'id': '001', 'name': 'Alice', 'department': 'HR', 'salary': '5000'},
        {'id': '002', 'name': 'Bob', 'department': 'IT', 'salary': '7000'},
        {'id': '003', 'name': 'Charlie', 'department': 'Finance', 'salary': '6000'},
        {'id': '004', 'name': 'David', 'department': 'Marketing', 'salary': '5500'}
    ]
    csv_handler.write_dict_to_csv(file_path2, dict_data, add_bom=True)
    
    # 读取并显示数据
    dict_result = csv_handler.read_dict_from_csv(file_path2)
    print("\n读取example2.csv文件内容:")
    for row in dict_result:
        print(row)